package br.com.rotary.modelo;

import br.com.rotary.enums.EstadoCivil;
import br.com.rotary.generico.EntidadeGenerica;
import br.com.rotary.validador.CPF;
import java.io.Serializable;
import java.text.ParseException;
import java.util.Date;
import java.util.List;
import javax.persistence.*;
import javax.swing.text.MaskFormatter;

/**
 *
 * @author laverson
 */
@Entity
public class Pessoa extends EntidadeGenerica implements Serializable {

    @Id
    @SequenceGenerator(sequenceName = "seq_proprietario", name = "seq_proprietario", allocationSize = 1)
    @GeneratedValue(generator = "seq_proprietario", strategy = GenerationType.SEQUENCE)
    private Long id;
    private String nome;
    @CPF
    private String cpf;
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date dataNascimento;
    private String rg;
    private String orgaoEmissor;
    private String profissao;
    private String localTrabalho;
    @OneToOne(cascade = {CascadeType.ALL})
    private Endereco endereco;
    @Enumerated(EnumType.STRING)
    private EstadoCivil estadoCivil;
    private String telefone;
    private String celular;
    private String email;
    @OneToOne
    private Pessoa conjuge;
    @OneToMany(cascade = {CascadeType.ALL})
    private List<Anexo> anexos;
    private String enderecoSimples;

    public Pessoa() {
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getCpf() {
        return cpf;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    public Date getDataNascimento() {
        return dataNascimento;
    }

    public void setDataNascimento(Date dataNascimento) {
        this.dataNascimento = dataNascimento;
    }

    public Pessoa getConjuge() {
        return conjuge;
    }

    public void setConjuge(Pessoa conjuge) {
        this.conjuge = conjuge;
    }

    public String getRg() {
        return rg;
    }

    public void setRg(String rg) {
        this.rg = rg;
    }

    public String getOrgaoEmissor() {
        return orgaoEmissor;
    }

    public void setOrgaoEmissor(String orgaoEmissor) {
        this.orgaoEmissor = orgaoEmissor;
    }

    public Endereco getEndereco() {
        return endereco;
    }

    public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }

    public String getLocalTrabalho() {
        return localTrabalho;
    }

    public void setLocalTrabalho(String localTrabalho) {
        this.localTrabalho = localTrabalho;
    }

    public String getProfissao() {
        return profissao;
    }

    public void setProfissao(String profissao) {
        this.profissao = profissao;
    }

    public EstadoCivil getEstadoCivil() {
        return estadoCivil;
    }

    public void setEstadoCivil(EstadoCivil estadoCivil) {
        this.estadoCivil = estadoCivil;
    }

    public String getTelefone() {
        return telefone;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }

    public List<Anexo> getAnexos() {
        return anexos;
    }

    public void setAnexos(List<Anexo> anexos) {
        this.anexos = anexos;
    }

    public String getCelular() {
        return celular;
    }

    public void setCelular(String celular) {
        this.celular = celular;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getEnderecoSimples() {
        return enderecoSimples;
    }

    public void setEnderecoSimples(String enderecoSimples) {
        this.enderecoSimples = enderecoSimples;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 59 * hash + (this.id != null ? this.id.hashCode() : 0);
        hash = 59 * hash + (this.nome != null ? this.nome.hashCode() : 0);
        hash = 59 * hash + (this.cpf != null ? this.cpf.hashCode() : 0);
        hash = 59 * hash + (this.dataNascimento != null ? this.dataNascimento.hashCode() : 0);
        hash = 59 * hash + (this.rg != null ? this.rg.hashCode() : 0);
        hash = 59 * hash + (this.orgaoEmissor != null ? this.orgaoEmissor.hashCode() : 0);
        hash = 59 * hash + (this.profissao != null ? this.profissao.hashCode() : 0);
        hash = 59 * hash + (this.localTrabalho != null ? this.localTrabalho.hashCode() : 0);
        hash = 59 * hash + (this.endereco != null ? this.endereco.hashCode() : 0);
        hash = 59 * hash + (this.estadoCivil != null ? this.estadoCivil.hashCode() : 0);
        hash = 59 * hash + (this.telefone != null ? this.telefone.hashCode() : 0);
        hash = 59 * hash + (this.celular != null ? this.celular.hashCode() : 0);
        hash = 59 * hash + (this.email != null ? this.email.hashCode() : 0);
        hash = 59 * hash + (this.conjuge != null ? this.conjuge.hashCode() : 0);
        hash = 59 * hash + (this.anexos != null ? this.anexos.hashCode() : 0);
        hash = 59 * hash + (this.enderecoSimples != null ? this.enderecoSimples.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Pessoa other = (Pessoa) obj;
        if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
            return false;
        }
        if ((this.nome == null) ? (other.nome != null) : !this.nome.equals(other.nome)) {
            return false;
        }
        if ((this.cpf == null) ? (other.cpf != null) : !this.cpf.equals(other.cpf)) {
            return false;
        }
        if (this.dataNascimento != other.dataNascimento && (this.dataNascimento == null || !this.dataNascimento.equals(other.dataNascimento))) {
            return false;
        }
        if ((this.rg == null) ? (other.rg != null) : !this.rg.equals(other.rg)) {
            return false;
        }
        if ((this.orgaoEmissor == null) ? (other.orgaoEmissor != null) : !this.orgaoEmissor.equals(other.orgaoEmissor)) {
            return false;
        }
        if ((this.profissao == null) ? (other.profissao != null) : !this.profissao.equals(other.profissao)) {
            return false;
        }
        if ((this.localTrabalho == null) ? (other.localTrabalho != null) : !this.localTrabalho.equals(other.localTrabalho)) {
            return false;
        }
        if (this.endereco != other.endereco && (this.endereco == null || !this.endereco.equals(other.endereco))) {
            return false;
        }
        if (this.estadoCivil != other.estadoCivil) {
            return false;
        }
        if ((this.telefone == null) ? (other.telefone != null) : !this.telefone.equals(other.telefone)) {
            return false;
        }
        if ((this.celular == null) ? (other.celular != null) : !this.celular.equals(other.celular)) {
            return false;
        }
        if ((this.email == null) ? (other.email != null) : !this.email.equals(other.email)) {
            return false;
        }
        if (this.conjuge != other.conjuge && (this.conjuge == null || !this.conjuge.equals(other.conjuge))) {
            return false;
        }
        if (this.anexos != other.anexos && (this.anexos == null || !this.anexos.equals(other.anexos))) {
            return false;
        }
        if ((this.enderecoSimples == null) ? (other.enderecoSimples != null) : !this.enderecoSimples.equals(other.enderecoSimples)) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Pessoa{" + "id=" + id + ", nome=" + nome + ", cpf=" + cpf + ", dataNascimento=" + dataNascimento + ", rg=" + rg + ", orgaoEmissor=" + orgaoEmissor + ", profissao=" + profissao + ", localTrabalho=" + localTrabalho + ", endereco=" + endereco + ", estadoCivil=" + estadoCivil + ", telefone=" + telefone + ", celular=" + celular + ", email=" + email + ", conjuge=" + conjuge + ", anexos=" + anexos + ", enderecoSimples=" + enderecoSimples + '}';
    }

    public String formatedDocument() {
        MaskFormatter mask;
        String tipo;

        if (this.cpf == null || this.cpf.isEmpty()) {
            return "";
        }

        tipo = "CPF: ";

        try {
            String format, value;
            format = "###.###.###-##";
            value = this.getCpf();

            mask = new MaskFormatter(format);
            mask.setValueContainsLiteralCharacters(false);
            return tipo + mask.valueToString(value);
        } catch (ParseException e) {
            System.err.println(e);
        }

        return "";
    }
}
